
import { getToken, setToken, removeToken } from '@/utils/auth'
// 导入接口
import { getUserInfo, login } from '@/api/user'
// 导入静态路由模块
import { constantRoutes, resetRouter } from '@/router'
const state = {
  // 用户登录后的 token
  token: getToken(),
  // 用户信息，这里使用一个空对象
  userInfo: {},
  routs: constantRoutes // 这里声明 state 存储路由信息，初始值是静态路由数据
}

const mutations = {
  // 登录成功后保存 token
  setToken(state, token) {
    state.token = token
    // 同步到缓存
    setToken(token)
  },
  // 清除 token
  removeToken(state, token) {
    // 删除 vuex 中的 token
    state.token = null
    removeToken()
  },
  // 保存用户信息
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo
  },
  // 声明 mutations 方便在 permission 中调用 提交把路由数据存在到 vuex 中方便显示菜单
  setRoutes(state, filterRoutes) {
    state.routs = [...constantRoutes, ...filterRoutes]
  }
}

const actions = {
  // 参数1： context 上下文
  // 参数2：传递的数据
  async login(context, data) {
    // console.log(data)
    // TODO 调用登录接口
    // 成功后执行下面 await 失败了不会执行，在 请求拦截器中处理了
    const token = await login(data)
    // 返回 token
    context.commit('setToken', token)
  },
  // 获取用户信息
  async getUserInfo(context) {
    const result = await getUserInfo()
    context.commit('setUserInfo', result)
    // 这里返回获取到的用户信息，方便在路由守卫中进行权限判断
    return result
  },
  // 退出登录
  logout(context) {
    context.commit('removeToken') // 删除 token
    context.commit('setUserInfo', {}) // 设置用户信息为空对象
    // 退出重置路由 如果管理员登录后退出了，在同一个浏览器使用其他账户登录后通过地址栏输入地址可用访问他没有权限的页面
    resetRouter()
  }

}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

